package com.excilys.formation.projet.ebanking.ws.soap;

import java.util.List;

import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import com.excilys.formation.ebanking_soap.EbankingSoap;
import com.excilys.formation.ebanking_soap.EffectuerVirementFault;
import com.excilys.formation.ebanking_soap.GetComptesByClientFault;
import com.excilys.formation.ebanking_soap.ListeComptesDTO;
import com.excilys.formation.ebanking_soap.VirementDTO;
import com.excilys.formation.projet.ebanking.modele.Compte;
import com.excilys.formation.projet.ebanking.modele.Utilisateur;
import com.excilys.formation.projet.ebanking.service.api.IClientService;
import com.excilys.formation.projet.ebanking.service.api.ICompteService;
import com.excilys.formation.projet.ebanking.service.api.IUtilisateurService;
import com.excilys.formation.projet.ebanking.service.api.exception.SoldeInsuffisantException;
import com.excilys.formation.projet.ebanking.ws.soap.converters.ListComptesConverter;

@Transactional(readOnly = true)
public class EbankingSoapImpl implements EbankingSoap {

	@Autowired
	IClientService clientService;

	@Autowired
	IUtilisateurService utilisateurService;

	@Autowired
	ICompteService compteService;

	@Override
	public ListeComptesDTO getComptesByClient(String loginClient) throws GetComptesByClientFault {
		Utilisateur utilisateur = utilisateurService.getUtilisateurByLogin(loginClient);
		if (utilisateur == null) {
			throw new GetComptesByClientFault("Ce nom d'utilisateur n'existe pas");
		}
		List<Compte> list = clientService.getComptesByClient(utilisateur.getId());
		ListComptesConverter listComptesConverter = new ListComptesConverter();
		return listComptesConverter.modelToDto(list);
	}

	@Override
	@Transactional(readOnly = false)
	public void effectuerVirement(VirementDTO virement) throws EffectuerVirementFault {
		Compte compteSource = compteService.getCompte(virement.getIdCompteSource());
		Compte compteDestination = compteService.getCompte(virement.getIdCompteDestination());

		try {
			clientService.addVirementInterne(compteSource, compteDestination, virement.getMontant(), new DateTime());
		}
		catch (SoldeInsuffisantException e) {
			throw new EffectuerVirementFault(e.getMessage(), e);
		}
	}

}